<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/cmpxchg.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/arch/x86/include/asm/cmpxchg.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="Maybe">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_QVNNX1g4Nl9DTVBYQ0hHX0hfMA__"><span class="b">ASM_X86_CMPXCHG_H</span></a>
<a name="2" /><span class="Maybe">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_QVNNX1g4Nl9DTVBYQ0hHX0hfMA__"><span class="b">ASM_X86_CMPXCHG_H</span></a>
<a name="3" /><span class="Maybe">       3:</span> 
<a name="4" /><span class="Maybe">       4:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">compiler</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="5" /><span class="Maybe">       5:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><a href="cpu.c_macros_ref.html#_YWx0ZXJuYXRpdmVfMA__"><span class="b">alternative</span></a><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span> <span class="k">/* Provides LOCK_PREFIX */</span>
<a name="6" /><span class="Maybe">       6:</span> 
<a name="7" /><span class="Maybe">       7:</span> <span class="k">/*</span>
<a name="8" /><span class="Maybe">       8:</span> <span class="k"> * Non-existant functions to indicate usage errors at link time</span>
<a name="9" /><span class="Maybe">       9:</span> <span class="k"> * (or compile-time if the compiler implements __compiletime_error().</span>
<a name="10" /><span class="Maybe">      10:</span> <span class="k"> */</span>
<a name="11" /><span class="Maybe">      11:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">__xchg_wrong_size</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="12" /><span class="Maybe">      12:</span>     <a href="cpu.c_macros_ref.html#_X19jb21waWxldGltZV9lcnJvcl8w"><span class="b">__compiletime_error</span></a><span class="f">(</span><span class="e">&quot;Bad argument size for xchg&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="13" /><span class="Maybe">      13:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">__cmpxchg_wrong_size</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="14" /><span class="Maybe">      14:</span>     <a href="cpu.c_macros_ref.html#_X19jb21waWxldGltZV9lcnJvcl8w"><span class="b">__compiletime_error</span></a><span class="f">(</span><span class="e">&quot;Bad argument size for cmpxchg&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="15" /><span class="Maybe">      15:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">__xadd_wrong_size</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="16" /><span class="Maybe">      16:</span>     <a href="cpu.c_macros_ref.html#_X19jb21waWxldGltZV9lcnJvcl8w"><span class="b">__compiletime_error</span></a><span class="f">(</span><span class="e">&quot;Bad argument size for xadd&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="17" /><span class="Maybe">      17:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">__add_wrong_size</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="18" /><span class="Maybe">      18:</span>     <a href="cpu.c_macros_ref.html#_X19jb21waWxldGltZV9lcnJvcl8w"><span class="b">__compiletime_error</span></a><span class="f">(</span><span class="e">&quot;Bad argument size for add&quot;</span><span class="f">)</span><span class="f">;</span>
<a name="19" /><span class="Maybe">      19:</span> 
<a name="20" /><span class="Maybe">      20:</span> <span class="k">/*</span>
<a name="21" /><span class="Maybe">      21:</span> <span class="k"> * Constants for operation sizes. On 32-bit, the 64-bit size it set to</span>
<a name="22" /><span class="Maybe">      22:</span> <span class="k"> * -1 because sizeof will never return -1, thereby making those switch</span>
<a name="23" /><span class="Maybe">      23:</span> <span class="k"> * case statements guaranteeed dead code which the compiler will</span>
<a name="24" /><span class="Maybe">      24:</span> <span class="k"> * eliminate, and allowing the &quot;missing symbol in the default case&quot; to</span>
<a name="25" /><span class="Maybe">      25:</span> <span class="k"> * indicate a usage error.</span>
<a name="26" /><span class="Maybe">      26:</span> <span class="k"> */</span>
<a name="27" /><span class="Maybe">      27:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9CXzA_"><span class="b">__X86_CASE_B</span></a>    <span class="c">1</span>
<a name="28" /><span class="Maybe">      28:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9XXzA_"><span class="b">__X86_CASE_W</span></a>    <span class="c">2</span>
<a name="29" /><span class="Maybe">      29:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9MXzA_"><span class="b">__X86_CASE_L</span></a>    <span class="c">4</span>
<a name="30" /><span class="Maybe">      30:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHXzY0QklUXzA_"><span class="b">CONFIG_64BIT</span></a>
<a name="31" /><span class="Maybe">      31:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9RXzA_"><span class="b">__X86_CASE_Q</span></a>    <span class="c">8</span>
<a name="32" /><span class="False">      32:</span> <span class="f">#</span><span class="n">else</span>
<a name="33" /><span class="False">      33:</span> <span class="f">#</span><span class="n">define</span>    <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9RXzA_"><span class="b">__X86_CASE_Q</span></a>    <span class="f">-</span><span class="c">1</span>        <span class="k">/* sizeof will never return -1 */</span>
<a name="34" /><span class="Maybe">      34:</span> <span class="f">#</span><span class="n">endif</span>
<a name="35" /><span class="Maybe">      35:</span> 
<a name="36" /><span class="Maybe">      36:</span> <span class="k">/* </span>
<a name="37" /><span class="Maybe">      37:</span> <span class="k"> * An exchange-type operation, which takes a value and a pointer, and</span>
<a name="38" /><span class="Maybe">      38:</span> <span class="k"> * returns the old value.</span>
<a name="39" /><span class="Maybe">      39:</span> <span class="k"> */</span>
<a name="40" /><span class="Maybe">      40:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X194Y2hnX29wXzA_"><span class="b">__xchg_op</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">arg</span><span class="f">,</span> <span class="b">op</span><span class="f">,</span> <span class="b">lock</span><span class="f">)</span>                    \
<a name="41" /><span class="Maybe">      41:</span>     <span class="f">(</span><span class="f">{</span>                                \
<a name="42" /><span class="Maybe">      42:</span>             <span class="b">__typeof__</span> <span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span> <span class="b">__ret</span> <span class="f">=</span> <span class="f">(</span><span class="b">arg</span><span class="f">)</span><span class="f">;</span>            \
<a name="43" /><span class="Maybe">      43:</span>         <span class="m">switch</span> <span class="f">(</span><span class="m">sizeof</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span> <span class="f">{</span>                \
<a name="44" /><span class="Maybe">      44:</span>         <span class="m">case</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9CXzA_"><span class="b">__X86_CASE_B</span></a><span class="f">:</span>                    \
<a name="45" /><span class="Maybe">      45:</span>             <span class="m">asm</span> <span class="m">volatile</span> <span class="f">(</span><span class="b">lock</span> <span class="f">#</span><span class="b">op</span> <span class="e">&quot;b %b0, %1\n&quot;</span>        \
<a name="46" /><span class="Maybe">      46:</span>                       <span class="f">:</span> <span class="e">&quot;+q&quot;</span> <span class="f">(</span><span class="b">__ret</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;+m&quot;</span> <span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span>    \
<a name="47" /><span class="Maybe">      47:</span>                       <span class="f">:</span> <span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">,</span> <span class="e">&quot;cc&quot;</span><span class="f">)</span><span class="f">;</span>        \
<a name="48" /><span class="Maybe">      48:</span>             <span class="m">break</span><span class="f">;</span>                        \
<a name="49" /><span class="Maybe">      49:</span>         <span class="m">case</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9XXzA_"><span class="b">__X86_CASE_W</span></a><span class="f">:</span>                    \
<a name="50" /><span class="Maybe">      50:</span>             <span class="m">asm</span> <span class="m">volatile</span> <span class="f">(</span><span class="b">lock</span> <span class="f">#</span><span class="b">op</span> <span class="e">&quot;w %w0, %1\n&quot;</span>        \
<a name="51" /><span class="Maybe">      51:</span>                       <span class="f">:</span> <span class="e">&quot;+r&quot;</span> <span class="f">(</span><span class="b">__ret</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;+m&quot;</span> <span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span>    \
<a name="52" /><span class="Maybe">      52:</span>                       <span class="f">:</span> <span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">,</span> <span class="e">&quot;cc&quot;</span><span class="f">)</span><span class="f">;</span>        \
<a name="53" /><span class="Maybe">      53:</span>             <span class="m">break</span><span class="f">;</span>                        \
<a name="54" /><span class="Maybe">      54:</span>         <span class="m">case</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9MXzA_"><span class="b">__X86_CASE_L</span></a><span class="f">:</span>                    \
<a name="55" /><span class="Maybe">      55:</span>             <span class="m">asm</span> <span class="m">volatile</span> <span class="f">(</span><span class="b">lock</span> <span class="f">#</span><span class="b">op</span> <span class="e">&quot;l %0, %1\n&quot;</span>        \
<a name="56" /><span class="Maybe">      56:</span>                       <span class="f">:</span> <span class="e">&quot;+r&quot;</span> <span class="f">(</span><span class="b">__ret</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;+m&quot;</span> <span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span>    \
<a name="57" /><span class="Maybe">      57:</span>                       <span class="f">:</span> <span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">,</span> <span class="e">&quot;cc&quot;</span><span class="f">)</span><span class="f">;</span>        \
<a name="58" /><span class="Maybe">      58:</span>             <span class="m">break</span><span class="f">;</span>                        \
<a name="59" /><span class="Maybe">      59:</span>         <span class="m">case</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9RXzA_"><span class="b">__X86_CASE_Q</span></a><span class="f">:</span>                    \
<a name="60" /><span class="Maybe">      60:</span>             <span class="m">asm</span> <span class="m">volatile</span> <span class="f">(</span><span class="b">lock</span> <span class="f">#</span><span class="b">op</span> <span class="e">&quot;q %q0, %1\n&quot;</span>        \
<a name="61" /><span class="Maybe">      61:</span>                       <span class="f">:</span> <span class="e">&quot;+r&quot;</span> <span class="f">(</span><span class="b">__ret</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;+m&quot;</span> <span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span>    \
<a name="62" /><span class="Maybe">      62:</span>                       <span class="f">:</span> <span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">,</span> <span class="e">&quot;cc&quot;</span><span class="f">)</span><span class="f">;</span>        \
<a name="63" /><span class="Maybe">      63:</span>             <span class="m">break</span><span class="f">;</span>                        \
<a name="64" /><span class="Maybe">      64:</span>         <span class="m">default</span><span class="f">:</span>                        \
<a name="65" /><span class="Maybe">      65:</span>             <span class="b">__</span> <span class="f">##</span> <span class="b">op</span> <span class="f">##</span> <span class="b">_wrong_size</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>            \
<a name="66" /><span class="Maybe">      66:</span>         <span class="f">}</span>                            \
<a name="67" /><span class="Maybe">      67:</span>         <span class="b">__ret</span><span class="f">;</span>                            \
<a name="68" /><span class="Maybe">      68:</span>     <span class="f">}</span><span class="f">)</span>
<a name="69" /><span class="Maybe">      69:</span> 
<a name="70" /><span class="Maybe">      70:</span> <span class="k">/*</span>
<a name="71" /><span class="Maybe">      71:</span> <span class="k"> * Note: no &quot;lock&quot; prefix even on SMP: xchg always implies lock anyway.</span>
<a name="72" /><span class="Maybe">      72:</span> <span class="k"> * Since this is generally used to protect other memory information, we</span>
<a name="73" /><span class="Maybe">      73:</span> <span class="k"> * use &quot;asm volatile&quot; and &quot;memory&quot; clobbers to prevent gcc from moving</span>
<a name="74" /><span class="Maybe">      74:</span> <span class="k"> * information around.</span>
<a name="75" /><span class="Maybe">      75:</span> <span class="k"> */</span>
<a name="76" /><span class="Maybe">      76:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_eGNoZ18w"><span class="b">xchg</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">v</span><span class="f">)</span>    <a href="cpu.c_macros_ref.html#_X194Y2hnX29wXzA_"><span class="b">__xchg_op</span></a><span class="f">(</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">v</span><span class="f">)</span><span class="f">,</span> <a href="cpu.c_macros_ref.html#_eGNoZ18w"><span class="b">xchg</span></a><span class="f">,</span> <span class="e">&quot;&quot;</span><span class="f">)</span>
<a name="77" /><span class="Maybe">      77:</span> 
<a name="78" /><span class="Maybe">      78:</span> <span class="k">/*</span>
<a name="79" /><span class="Maybe">      79:</span> <span class="k"> * Atomic compare and exchange.  Compare OLD with MEM, if identical,</span>
<a name="80" /><span class="Maybe">      80:</span> <span class="k"> * store NEW in MEM.  Return the initial value in MEM.  Success is</span>
<a name="81" /><span class="Maybe">      81:</span> <span class="k"> * indicated by comparing RETURN with OLD.</span>
<a name="82" /><span class="Maybe">      82:</span> <span class="k"> */</span>
<a name="83" /><span class="Maybe">      83:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19yYXdfY21weGNoZ18w"><span class="b">__raw_cmpxchg</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">old</span><span class="f">,</span> <span class="m">new</span><span class="f">,</span> <span class="b">size</span><span class="f">,</span> <span class="b">lock</span><span class="f">)</span>            \
<a name="84" /><span class="Maybe">      84:</span> <span class="f">(</span><span class="f">{</span>                                    \
<a name="85" /><span class="Maybe">      85:</span>     <span class="b">__typeof__</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span> <span class="b">__ret</span><span class="f">;</span>                    \
<a name="86" /><span class="Maybe">      86:</span>     <span class="b">__typeof__</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span> <span class="b">__old</span> <span class="f">=</span> <span class="f">(</span><span class="b">old</span><span class="f">)</span><span class="f">;</span>                \
<a name="87" /><span class="Maybe">      87:</span>     <span class="b">__typeof__</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span> <span class="b">__new</span> <span class="f">=</span> <span class="f">(</span><span class="m">new</span><span class="f">)</span><span class="f">;</span>                \
<a name="88" /><span class="Maybe">      88:</span>     <span class="m">switch</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span> <span class="f">{</span>                            \
<a name="89" /><span class="Maybe">      89:</span>     <span class="m">case</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9CXzA_"><span class="b">__X86_CASE_B</span></a><span class="f">:</span>                        \
<a name="90" /><span class="Maybe">      90:</span>     <span class="f">{</span>                                \
<a name="91" /><span class="Maybe">      91:</span>         <span class="m">volatile</span> <span class="b">u8</span> <span class="f">*</span><span class="b">__ptr</span> <span class="f">=</span> <span class="f">(</span><span class="m">volatile</span> <span class="b">u8</span> <span class="f">*</span><span class="f">)</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">;</span>        \
<a name="92" /><span class="Maybe">      92:</span>         <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="b">lock</span> <span class="e">&quot;cmpxchgb %2,%1&quot;</span>            \
<a name="93" /><span class="Maybe">      93:</span>                  <span class="f">:</span> <span class="e">&quot;=a&quot;</span> <span class="f">(</span><span class="b">__ret</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;+m&quot;</span> <span class="f">(</span><span class="f">*</span><span class="b">__ptr</span><span class="f">)</span>        \
<a name="94" /><span class="Maybe">      94:</span>                  <span class="f">:</span> <span class="e">&quot;q&quot;</span> <span class="f">(</span><span class="b">__new</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;0&quot;</span> <span class="f">(</span><span class="b">__old</span><span class="f">)</span>            \
<a name="95" /><span class="Maybe">      95:</span>                  <span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">)</span><span class="f">;</span>                \
<a name="96" /><span class="Maybe">      96:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="97" /><span class="Maybe">      97:</span>     <span class="f">}</span>                                \
<a name="98" /><span class="Maybe">      98:</span>     <span class="m">case</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9XXzA_"><span class="b">__X86_CASE_W</span></a><span class="f">:</span>                        \
<a name="99" /><span class="Maybe">      99:</span>     <span class="f">{</span>                                \
<a name="100" /><span class="Maybe">     100:</span>         <span class="m">volatile</span> <span class="b">u16</span> <span class="f">*</span><span class="b">__ptr</span> <span class="f">=</span> <span class="f">(</span><span class="m">volatile</span> <span class="b">u16</span> <span class="f">*</span><span class="f">)</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">;</span>        \
<a name="101" /><span class="Maybe">     101:</span>         <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="b">lock</span> <span class="e">&quot;cmpxchgw %2,%1&quot;</span>            \
<a name="102" /><span class="Maybe">     102:</span>                  <span class="f">:</span> <span class="e">&quot;=a&quot;</span> <span class="f">(</span><span class="b">__ret</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;+m&quot;</span> <span class="f">(</span><span class="f">*</span><span class="b">__ptr</span><span class="f">)</span>        \
<a name="103" /><span class="Maybe">     103:</span>                  <span class="f">:</span> <span class="e">&quot;r&quot;</span> <span class="f">(</span><span class="b">__new</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;0&quot;</span> <span class="f">(</span><span class="b">__old</span><span class="f">)</span>            \
<a name="104" /><span class="Maybe">     104:</span>                  <span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">)</span><span class="f">;</span>                \
<a name="105" /><span class="Maybe">     105:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="106" /><span class="Maybe">     106:</span>     <span class="f">}</span>                                \
<a name="107" /><span class="Maybe">     107:</span>     <span class="m">case</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9MXzA_"><span class="b">__X86_CASE_L</span></a><span class="f">:</span>                        \
<a name="108" /><span class="Maybe">     108:</span>     <span class="f">{</span>                                \
<a name="109" /><span class="Maybe">     109:</span>         <span class="m">volatile</span> <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a> <span class="f">*</span><span class="b">__ptr</span> <span class="f">=</span> <span class="f">(</span><span class="m">volatile</span> <a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a> <span class="f">*</span><span class="f">)</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">;</span>        \
<a name="110" /><span class="Maybe">     110:</span>         <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="b">lock</span> <span class="e">&quot;cmpxchgl %2,%1&quot;</span>            \
<a name="111" /><span class="Maybe">     111:</span>                  <span class="f">:</span> <span class="e">&quot;=a&quot;</span> <span class="f">(</span><span class="b">__ret</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;+m&quot;</span> <span class="f">(</span><span class="f">*</span><span class="b">__ptr</span><span class="f">)</span>        \
<a name="112" /><span class="Maybe">     112:</span>                  <span class="f">:</span> <span class="e">&quot;r&quot;</span> <span class="f">(</span><span class="b">__new</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;0&quot;</span> <span class="f">(</span><span class="b">__old</span><span class="f">)</span>            \
<a name="113" /><span class="Maybe">     113:</span>                  <span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">)</span><span class="f">;</span>                \
<a name="114" /><span class="Maybe">     114:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="115" /><span class="Maybe">     115:</span>     <span class="f">}</span>                                \
<a name="116" /><span class="Maybe">     116:</span>     <span class="m">case</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9RXzA_"><span class="b">__X86_CASE_Q</span></a><span class="f">:</span>                        \
<a name="117" /><span class="Maybe">     117:</span>     <span class="f">{</span>                                \
<a name="118" /><span class="Maybe">     118:</span>         <span class="m">volatile</span> <span class="b">u64</span> <span class="f">*</span><span class="b">__ptr</span> <span class="f">=</span> <span class="f">(</span><span class="m">volatile</span> <span class="b">u64</span> <span class="f">*</span><span class="f">)</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">;</span>        \
<a name="119" /><span class="Maybe">     119:</span>         <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="b">lock</span> <span class="e">&quot;cmpxchgq %2,%1&quot;</span>            \
<a name="120" /><span class="Maybe">     120:</span>                  <span class="f">:</span> <span class="e">&quot;=a&quot;</span> <span class="f">(</span><span class="b">__ret</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;+m&quot;</span> <span class="f">(</span><span class="f">*</span><span class="b">__ptr</span><span class="f">)</span>        \
<a name="121" /><span class="Maybe">     121:</span>                  <span class="f">:</span> <span class="e">&quot;r&quot;</span> <span class="f">(</span><span class="b">__new</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;0&quot;</span> <span class="f">(</span><span class="b">__old</span><span class="f">)</span>            \
<a name="122" /><span class="Maybe">     122:</span>                  <span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">)</span><span class="f">;</span>                \
<a name="123" /><span class="Maybe">     123:</span>         <span class="m">break</span><span class="f">;</span>                            \
<a name="124" /><span class="Maybe">     124:</span>     <span class="f">}</span>                                \
<a name="125" /><span class="Maybe">     125:</span>     <span class="m">default</span><span class="f">:</span>                            \
<a name="126" /><span class="Maybe">     126:</span>         <span class="b">__cmpxchg_wrong_size</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>                    \
<a name="127" /><span class="Maybe">     127:</span>     <span class="f">}</span>                                \
<a name="128" /><span class="Maybe">     128:</span>     <span class="b">__ret</span><span class="f">;</span>                                \
<a name="129" /><span class="Maybe">     129:</span> <span class="f">}</span><span class="f">)</span>
<a name="130" /><span class="Maybe">     130:</span> 
<a name="131" /><span class="Maybe">     131:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19jbXB4Y2hnXzA_"><span class="b">__cmpxchg</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">old</span><span class="f">,</span> <span class="m">new</span><span class="f">,</span> <span class="b">size</span><span class="f">)</span>                    \
<a name="132" /><span class="Maybe">     132:</span>     <a href="cpu.c_macros_ref.html#_X19yYXdfY21weGNoZ18w"><span class="b">__raw_cmpxchg</span></a><span class="f">(</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">old</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="m">new</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">,</span> <a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfMA__"><span class="b">LOCK_PREFIX</span></a><span class="f">)</span>
<a name="133" /><span class="Maybe">     133:</span> 
<a name="134" /><span class="Maybe">     134:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19zeW5jX2NtcHhjaGdfMA__"><span class="b">__sync_cmpxchg</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">old</span><span class="f">,</span> <span class="m">new</span><span class="f">,</span> <span class="b">size</span><span class="f">)</span>                \
<a name="135" /><span class="Maybe">     135:</span>     <a href="cpu.c_macros_ref.html#_X19yYXdfY21weGNoZ18w"><span class="b">__raw_cmpxchg</span></a><span class="f">(</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">old</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="m">new</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;lock; &quot;</span><span class="f">)</span>
<a name="136" /><span class="Maybe">     136:</span> 
<a name="137" /><span class="Maybe">     137:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19jbXB4Y2hnX2xvY2FsXzA_"><span class="b">__cmpxchg_local</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">old</span><span class="f">,</span> <span class="m">new</span><span class="f">,</span> <span class="b">size</span><span class="f">)</span>                \
<a name="138" /><span class="Maybe">     138:</span>     <a href="cpu.c_macros_ref.html#_X19yYXdfY21weGNoZ18w"><span class="b">__raw_cmpxchg</span></a><span class="f">(</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">old</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="m">new</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">size</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;&quot;</span><span class="f">)</span>
<a name="139" /><span class="Maybe">     139:</span> 
<a name="140" /><span class="False">     140:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_X86_32</span>
<a name="141" /><span class="False">     141:</span> <span class="f">#</span> <span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">cmpxchg_32</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="142" /><span class="Maybe">     142:</span> <span class="f">#</span><span class="n">else</span>
<a name="143" /><span class="Maybe">     143:</span> <span class="f">#</span> <span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">cmpxchg_64</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="144" /><span class="Maybe">     144:</span> <span class="f">#</span><span class="n">endif</span>
<a name="145" /><span class="Maybe">     145:</span> 
<a name="146" /><span class="Maybe">     146:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_X19IQVZFX0FSQ0hfQ01QWENIR18w"><span class="b">__HAVE_ARCH_CMPXCHG</span></a>
<a name="147" /><span class="Maybe">     147:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_Y21weGNoZ18w"><span class="b">cmpxchg</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">old</span><span class="f">,</span> <span class="m">new</span><span class="f">)</span>                        \
<a name="148" /><span class="Maybe">     148:</span>     <a href="cpu.c_macros_ref.html#_X19jbXB4Y2hnXzA_"><span class="b">__cmpxchg</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">old</span><span class="f">,</span> <span class="m">new</span><span class="f">,</span> <span class="m">sizeof</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="149" /><span class="Maybe">     149:</span> 
<a name="150" /><span class="Maybe">     150:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_c3luY19jbXB4Y2hnXzA_"><span class="b">sync_cmpxchg</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">old</span><span class="f">,</span> <span class="m">new</span><span class="f">)</span>                    \
<a name="151" /><span class="Maybe">     151:</span>     <a href="cpu.c_macros_noref.html#_X19zeW5jX2NtcHhjaGdfMA__"><span class="b">__sync_cmpxchg</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">old</span><span class="f">,</span> <span class="m">new</span><span class="f">,</span> <span class="m">sizeof</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="152" /><span class="Maybe">     152:</span> 
<a name="153" /><span class="Maybe">     153:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Y21weGNoZ19sb2NhbF8w"><span class="b">cmpxchg_local</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">old</span><span class="f">,</span> <span class="m">new</span><span class="f">)</span>                    \
<a name="154" /><span class="Maybe">     154:</span>     <a href="cpu.c_macros_noref.html#_X19jbXB4Y2hnX2xvY2FsXzA_"><span class="b">__cmpxchg_local</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">old</span><span class="f">,</span> <span class="m">new</span><span class="f">,</span> <span class="m">sizeof</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span>
<a name="155" /><span class="Maybe">     155:</span> <span class="f">#</span><span class="n">endif</span>
<a name="156" /><span class="Maybe">     156:</span> 
<a name="157" /><span class="Maybe">     157:</span> <span class="k">/*</span>
<a name="158" /><span class="Maybe">     158:</span> <span class="k"> * xadd() adds &quot;inc&quot; to &quot;*ptr&quot; and atomically returns the previous</span>
<a name="159" /><span class="Maybe">     159:</span> <span class="k"> * value of &quot;*ptr&quot;.</span>
<a name="160" /><span class="Maybe">     160:</span> <span class="k"> *</span>
<a name="161" /><span class="Maybe">     161:</span> <span class="k"> * xadd() is locked when multiple CPUs are online</span>
<a name="162" /><span class="Maybe">     162:</span> <span class="k"> * xadd_sync() is always locked</span>
<a name="163" /><span class="Maybe">     163:</span> <span class="k"> * xadd_local() is never locked</span>
<a name="164" /><span class="Maybe">     164:</span> <span class="k"> */</span>
<a name="165" /><span class="Maybe">     165:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X194YWRkXzA_"><span class="b">__xadd</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">inc</span><span class="f">,</span> <span class="b">lock</span><span class="f">)</span>    <a href="cpu.c_macros_ref.html#_X194Y2hnX29wXzA_"><span class="b">__xchg_op</span></a><span class="f">(</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">inc</span><span class="f">)</span><span class="f">,</span> <a href="cpu.c_macros_ref.html#_eGFkZF8w"><span class="b">xadd</span></a><span class="f">,</span> <span class="b">lock</span><span class="f">)</span>
<a name="166" /><span class="Maybe">     166:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_eGFkZF8w"><span class="b">xadd</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">inc</span><span class="f">)</span>        <a href="cpu.c_macros_ref.html#_X194YWRkXzA_"><span class="b">__xadd</span></a><span class="f">(</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">inc</span><span class="f">)</span><span class="f">,</span> <a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfMA__"><span class="b">LOCK_PREFIX</span></a><span class="f">)</span>
<a name="167" /><span class="Maybe">     167:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_eGFkZF9zeW5jXzA_"><span class="b">xadd_sync</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">inc</span><span class="f">)</span>    <a href="cpu.c_macros_ref.html#_X194YWRkXzA_"><span class="b">__xadd</span></a><span class="f">(</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">inc</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;lock; &quot;</span><span class="f">)</span>
<a name="168" /><span class="Maybe">     168:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_eGFkZF9sb2NhbF8w"><span class="b">xadd_local</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">inc</span><span class="f">)</span>    <a href="cpu.c_macros_ref.html#_X194YWRkXzA_"><span class="b">__xadd</span></a><span class="f">(</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">inc</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;&quot;</span><span class="f">)</span>
<a name="169" /><span class="Maybe">     169:</span> 
<a name="170" /><span class="Maybe">     170:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X19hZGRfMA__"><span class="b">__add</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">inc</span><span class="f">,</span> <span class="b">lock</span><span class="f">)</span>                        \
<a name="171" /><span class="Maybe">     171:</span>     <span class="f">(</span><span class="f">{</span>                                \
<a name="172" /><span class="Maybe">     172:</span>             <span class="b">__typeof__</span> <span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span> <span class="b">__ret</span> <span class="f">=</span> <span class="f">(</span><span class="b">inc</span><span class="f">)</span><span class="f">;</span>            \
<a name="173" /><span class="Maybe">     173:</span>         <span class="m">switch</span> <span class="f">(</span><span class="m">sizeof</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span><span class="f">)</span> <span class="f">{</span>                \
<a name="174" /><span class="Maybe">     174:</span>         <span class="m">case</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9CXzA_"><span class="b">__X86_CASE_B</span></a><span class="f">:</span>                    \
<a name="175" /><span class="Maybe">     175:</span>             <span class="m">asm</span> <span class="m">volatile</span> <span class="f">(</span><span class="b">lock</span> <span class="e">&quot;addb %b1, %0\n&quot;</span>        \
<a name="176" /><span class="Maybe">     176:</span>                       <span class="f">:</span> <span class="e">&quot;+m&quot;</span> <span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span> <span class="f">:</span> <span class="e">&quot;qi&quot;</span> <span class="f">(</span><span class="b">inc</span><span class="f">)</span>    \
<a name="177" /><span class="Maybe">     177:</span>                       <span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">,</span> <span class="e">&quot;cc&quot;</span><span class="f">)</span><span class="f">;</span>        \
<a name="178" /><span class="Maybe">     178:</span>             <span class="m">break</span><span class="f">;</span>                        \
<a name="179" /><span class="Maybe">     179:</span>         <span class="m">case</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9XXzA_"><span class="b">__X86_CASE_W</span></a><span class="f">:</span>                    \
<a name="180" /><span class="Maybe">     180:</span>             <span class="m">asm</span> <span class="m">volatile</span> <span class="f">(</span><span class="b">lock</span> <span class="e">&quot;addw %w1, %0\n&quot;</span>        \
<a name="181" /><span class="Maybe">     181:</span>                       <span class="f">:</span> <span class="e">&quot;+m&quot;</span> <span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span> <span class="f">:</span> <span class="e">&quot;ri&quot;</span> <span class="f">(</span><span class="b">inc</span><span class="f">)</span>    \
<a name="182" /><span class="Maybe">     182:</span>                       <span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">,</span> <span class="e">&quot;cc&quot;</span><span class="f">)</span><span class="f">;</span>        \
<a name="183" /><span class="Maybe">     183:</span>             <span class="m">break</span><span class="f">;</span>                        \
<a name="184" /><span class="Maybe">     184:</span>         <span class="m">case</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9MXzA_"><span class="b">__X86_CASE_L</span></a><span class="f">:</span>                    \
<a name="185" /><span class="Maybe">     185:</span>             <span class="m">asm</span> <span class="m">volatile</span> <span class="f">(</span><span class="b">lock</span> <span class="e">&quot;addl %1, %0\n&quot;</span>        \
<a name="186" /><span class="Maybe">     186:</span>                       <span class="f">:</span> <span class="e">&quot;+m&quot;</span> <span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span> <span class="f">:</span> <span class="e">&quot;ri&quot;</span> <span class="f">(</span><span class="b">inc</span><span class="f">)</span>    \
<a name="187" /><span class="Maybe">     187:</span>                       <span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">,</span> <span class="e">&quot;cc&quot;</span><span class="f">)</span><span class="f">;</span>        \
<a name="188" /><span class="Maybe">     188:</span>             <span class="m">break</span><span class="f">;</span>                        \
<a name="189" /><span class="Maybe">     189:</span>         <span class="m">case</span> <a href="cpu.c_macros_ref.html#_X19YODZfQ0FTRV9RXzA_"><span class="b">__X86_CASE_Q</span></a><span class="f">:</span>                    \
<a name="190" /><span class="Maybe">     190:</span>             <span class="m">asm</span> <span class="m">volatile</span> <span class="f">(</span><span class="b">lock</span> <span class="e">&quot;addq %1, %0\n&quot;</span>        \
<a name="191" /><span class="Maybe">     191:</span>                       <span class="f">:</span> <span class="e">&quot;+m&quot;</span> <span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">)</span> <span class="f">:</span> <span class="e">&quot;ri&quot;</span> <span class="f">(</span><span class="b">inc</span><span class="f">)</span>    \
<a name="192" /><span class="Maybe">     192:</span>                       <span class="f">:</span> <span class="e">&quot;memory&quot;</span><span class="f">,</span> <span class="e">&quot;cc&quot;</span><span class="f">)</span><span class="f">;</span>        \
<a name="193" /><span class="Maybe">     193:</span>             <span class="m">break</span><span class="f">;</span>                        \
<a name="194" /><span class="Maybe">     194:</span>         <span class="m">default</span><span class="f">:</span>                        \
<a name="195" /><span class="Maybe">     195:</span>             <span class="b">__add_wrong_size</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>                \
<a name="196" /><span class="Maybe">     196:</span>         <span class="f">}</span>                            \
<a name="197" /><span class="Maybe">     197:</span>         <span class="b">__ret</span><span class="f">;</span>                            \
<a name="198" /><span class="Maybe">     198:</span>     <span class="f">}</span><span class="f">)</span>
<a name="199" /><span class="Maybe">     199:</span> 
<a name="200" /><span class="Maybe">     200:</span> <span class="k">/*</span>
<a name="201" /><span class="Maybe">     201:</span> <span class="k"> * add_*() adds &quot;inc&quot; to &quot;*ptr&quot;</span>
<a name="202" /><span class="Maybe">     202:</span> <span class="k"> *</span>
<a name="203" /><span class="Maybe">     203:</span> <span class="k"> * __add() takes a lock prefix</span>
<a name="204" /><span class="Maybe">     204:</span> <span class="k"> * add_smp() is locked when multiple CPUs are online</span>
<a name="205" /><span class="Maybe">     205:</span> <span class="k"> * add_sync() is always locked</span>
<a name="206" /><span class="Maybe">     206:</span> <span class="k"> */</span>
<a name="207" /><span class="Maybe">     207:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_YWRkX3NtcF8w"><span class="b">add_smp</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">inc</span><span class="f">)</span>    <a href="cpu.c_macros_ref.html#_X19hZGRfMA__"><span class="b">__add</span></a><span class="f">(</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">inc</span><span class="f">)</span><span class="f">,</span> <a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfMA__"><span class="b">LOCK_PREFIX</span></a><span class="f">)</span>
<a name="208" /><span class="Maybe">     208:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_YWRkX3N5bmNfMA__"><span class="b">add_sync</span></a><span class="f">(</span><span class="b">ptr</span><span class="f">,</span> <span class="b">inc</span><span class="f">)</span>    <a href="cpu.c_macros_ref.html#_X19hZGRfMA__"><span class="b">__add</span></a><span class="f">(</span><span class="f">(</span><span class="b">ptr</span><span class="f">)</span><span class="f">,</span> <span class="f">(</span><span class="b">inc</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;lock; &quot;</span><span class="f">)</span>
<a name="209" /><span class="Maybe">     209:</span> 
<a name="210" /><span class="Maybe">     210:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X19jbXB4Y2hnX2RvdWJsZV8w"><span class="b">__cmpxchg_double</span></a><span class="f">(</span><span class="b">pfx</span><span class="f">,</span> <span class="b">p1</span><span class="f">,</span> <span class="b">p2</span><span class="f">,</span> <span class="b">o1</span><span class="f">,</span> <span class="b">o2</span><span class="f">,</span> <span class="b">n1</span><span class="f">,</span> <span class="b">n2</span><span class="f">)</span>            \
<a name="211" /><span class="Maybe">     211:</span> <span class="f">(</span><span class="f">{</span>                                    \
<a name="212" /><span class="Maybe">     212:</span>     <span class="m">bool</span> <span class="b">__ret</span><span class="f">;</span>                            \
<a name="213" /><span class="Maybe">     213:</span>     <span class="b">__typeof__</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">p1</span><span class="f">)</span><span class="f">)</span> <span class="b">__old1</span> <span class="f">=</span> <span class="f">(</span><span class="b">o1</span><span class="f">)</span><span class="f">,</span> <span class="b">__new1</span> <span class="f">=</span> <span class="f">(</span><span class="b">n1</span><span class="f">)</span><span class="f">;</span>            \
<a name="214" /><span class="Maybe">     214:</span>     <span class="b">__typeof__</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">p2</span><span class="f">)</span><span class="f">)</span> <span class="b">__old2</span> <span class="f">=</span> <span class="f">(</span><span class="b">o2</span><span class="f">)</span><span class="f">,</span> <span class="b">__new2</span> <span class="f">=</span> <span class="f">(</span><span class="b">n2</span><span class="f">)</span><span class="f">;</span>            \
<a name="215" /><span class="Maybe">     215:</span>     <a href="cpu.c_macros_ref.html#_QlVJTERfQlVHX09OXzA_"><span class="b">BUILD_BUG_ON</span></a><span class="f">(</span><span class="m">sizeof</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">p1</span><span class="f">)</span><span class="f">)</span> <span class="f">!=</span> <span class="m">sizeof</span><span class="f">(</span><span class="m">long</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>            \
<a name="216" /><span class="Maybe">     216:</span>     <a href="cpu.c_macros_ref.html#_QlVJTERfQlVHX09OXzA_"><span class="b">BUILD_BUG_ON</span></a><span class="f">(</span><span class="m">sizeof</span><span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">p2</span><span class="f">)</span><span class="f">)</span> <span class="f">!=</span> <span class="m">sizeof</span><span class="f">(</span><span class="m">long</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>            \
<a name="217" /><span class="Maybe">     217:</span>     <a href="cpu.c_macros_ref.html#_Vk1fQlVHX09OXzA_"><span class="b">VM_BUG_ON</span></a><span class="f">(</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><span class="f">(</span><span class="b">p1</span><span class="f">)</span> <span class="f">%</span> <span class="f">(</span><span class="c">2</span> <span class="f">*</span> <span class="m">sizeof</span><span class="f">(</span><span class="m">long</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>        \
<a name="218" /><span class="Maybe">     218:</span>     <a href="cpu.c_macros_ref.html#_Vk1fQlVHX09OXzA_"><span class="b">VM_BUG_ON</span></a><span class="f">(</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><span class="f">(</span><span class="f">(</span><span class="b">p1</span><span class="f">)</span> <span class="f">+</span> <span class="c">1</span><span class="f">)</span> <span class="f">!=</span> <span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><span class="f">(</span><span class="b">p2</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>    \
<a name="219" /><span class="Maybe">     219:</span>     <span class="m">asm</span> <span class="m">volatile</span><span class="f">(</span><span class="b">pfx</span> <span class="e">&quot;cmpxchg%c4b %2; sete %0&quot;</span>            \
<a name="220" /><span class="Maybe">     220:</span>              <span class="f">:</span> <span class="e">&quot;=a&quot;</span> <span class="f">(</span><span class="b">__ret</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;+d&quot;</span> <span class="f">(</span><span class="b">__old2</span><span class="f">)</span><span class="f">,</span>            \
<a name="221" /><span class="Maybe">     221:</span>                <span class="e">&quot;+m&quot;</span> <span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">p1</span><span class="f">)</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;+m&quot;</span> <span class="f">(</span><span class="f">*</span><span class="f">(</span><span class="b">p2</span><span class="f">)</span><span class="f">)</span>            \
<a name="222" /><span class="Maybe">     222:</span>              <span class="f">:</span> <span class="e">&quot;i&quot;</span> <span class="f">(</span><span class="c">2</span> <span class="f">*</span> <span class="m">sizeof</span><span class="f">(</span><span class="m">long</span><span class="f">)</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;a&quot;</span> <span class="f">(</span><span class="b">__old1</span><span class="f">)</span><span class="f">,</span>        \
<a name="223" /><span class="Maybe">     223:</span>                <span class="e">&quot;b&quot;</span> <span class="f">(</span><span class="b">__new1</span><span class="f">)</span><span class="f">,</span> <span class="e">&quot;c&quot;</span> <span class="f">(</span><span class="b">__new2</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>            \
<a name="224" /><span class="Maybe">     224:</span>     <span class="b">__ret</span><span class="f">;</span>                                \
<a name="225" /><span class="Maybe">     225:</span> <span class="f">}</span><span class="f">)</span>
<a name="226" /><span class="Maybe">     226:</span> 
<a name="227" /><span class="Maybe">     227:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Y21weGNoZ19kb3VibGVfMA__"><span class="b">cmpxchg_double</span></a><span class="f">(</span><span class="b">p1</span><span class="f">,</span> <span class="b">p2</span><span class="f">,</span> <span class="b">o1</span><span class="f">,</span> <span class="b">o2</span><span class="f">,</span> <span class="b">n1</span><span class="f">,</span> <span class="b">n2</span><span class="f">)</span> \
<a name="228" /><span class="Maybe">     228:</span>     <a href="cpu.c_macros_noref.html#_X19jbXB4Y2hnX2RvdWJsZV8w"><span class="b">__cmpxchg_double</span></a><span class="f">(</span><a href="cpu.c_macros_ref.html#_TE9DS19QUkVGSVhfMA__"><span class="b">LOCK_PREFIX</span></a><span class="f">,</span> <span class="b">p1</span><span class="f">,</span> <span class="b">p2</span><span class="f">,</span> <span class="b">o1</span><span class="f">,</span> <span class="b">o2</span><span class="f">,</span> <span class="b">n1</span><span class="f">,</span> <span class="b">n2</span><span class="f">)</span>
<a name="229" /><span class="Maybe">     229:</span> 
<a name="230" /><span class="Maybe">     230:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Y21weGNoZ19kb3VibGVfbG9jYWxfMA__"><span class="b">cmpxchg_double_local</span></a><span class="f">(</span><span class="b">p1</span><span class="f">,</span> <span class="b">p2</span><span class="f">,</span> <span class="b">o1</span><span class="f">,</span> <span class="b">o2</span><span class="f">,</span> <span class="b">n1</span><span class="f">,</span> <span class="b">n2</span><span class="f">)</span> \
<a name="231" /><span class="Maybe">     231:</span>     <a href="cpu.c_macros_noref.html#_X19jbXB4Y2hnX2RvdWJsZV8w"><span class="b">__cmpxchg_double</span></a><span class="f">(</span><span class="f">,</span> <span class="b">p1</span><span class="f">,</span> <span class="b">p2</span><span class="f">,</span> <span class="b">o1</span><span class="f">,</span> <span class="b">o2</span><span class="f">,</span> <span class="b">n1</span><span class="f">,</span> <span class="b">n2</span><span class="f">)</span>
<a name="232" /><span class="Maybe">     232:</span> 
<a name="233" /><span class="True">     233:</span> <span class="f">#</span><span class="n">endif</span>    <span class="k">/* ASM_X86_CMPXCHG_H */</span>
<a name="234" /><span class="True">     234:</span> </pre>
  </body>
</html>
